Unity图片压缩

面向CPU

位图(点阵图像/像素图) 有一个个像素所组成的图像,缩放会失真

简单的纹理格式

通常情况下256种状态的维度图像,不压缩的情况下,一个像素要8bit【1Byte】

  • RGBA32(RGBA8888) 每个像素4字节,RGBA通道各占8位
  • RGBA16(RGBA4444) 每个像素2字节,RGBA通道各占4位
  • RGB24(RGB888) 每个像素3字节,RGB通道各占8位,无透明通道
  • RGB16(RGB565) 每个像素2字节,RGBA通道各占5/6/5位,无透明通道
  • RGBA16(RGBA5551) 每个像素2字节,RGB通道各占5位,透明通道占1位,要么完全透明要么完全不透明

决定纹理资源大小的因素

  • 分辨率
  • 格式
  • Mipmap

图片文件

  • 文件描述信息
  • 图像数据区

图片文件格式

  • png:无损的压缩图片形格式
  • jgp/jpeg:有损的压缩图片形格式 根据自己的压缩算法,将图像压缩在很小的存储空间,图像中重复或者不重要的资料会被丢失
  • gif
  • psd ps:专用格式,会保存图层、通道、路径等信息,是没有经过压缩的

图像数据压缩方式

采用像素图压缩图像数据

一张纹理所占用的内存:1024pixel*1024pixel*4Byte = 4M

面向GPU

面向GPU的压缩算法

  1. PC
    • DXT
  2. Android
    • ETC/ETC2
    • ASTC 4x4
    • RGBA crunched ETC2【带有crunched都是有损压缩】
      (纹理在CPU上被解压缩成ETC2格式,并在运行时加载到GPU上,虽然压缩时间较长,但是十分节省磁盘空间并且运行时解压速度很快)
  3. IOS
    • PVR

当选择压缩算法的时候,如果GPU不支持此压缩格式,那么纹理就会被解压缩成RGB或者RGBA格式的,会增加解压时间并且占用更多内存

纹理压缩格式

  • DXT:适用于各种windows设备,是一种有损的压缩方式,基本思想就是把4x4的像素快压缩成一个64或者128位的数据块。

  • DXT1:主要适用于RGB565(不具透明度的贴图)或RGBA5551(仅具一位Alpha的贴图)*RGB565对比RGB888也是一种缺失,因为人眼对绿色最敏感,所以G占6位。

    工作原理:将整张纹理图按照4x4像素分为一个个的块(每个块保留了2个16位的颜色),对保留的2个颜色进行插值得到另外2个颜色值,在4x4的像素块中,每一个像素颜色都对应这4个颜色之一,每个像素需要2bit。所以每个块用64位 = 4x4像素 x 2bit + 2个颜色 x 16位。这种压缩格式整体效果不错,但是如果对局部做特写的话会发现细节上有很多的丢失,是因为每个块只会保留两个颜色,所以当一个块中出现了两个以上的颜色的时候,那么有的颜色就丢失,这种细节丢失的情况通常发生在比较细的边界中,但是由于DXT1的压缩率是RGB的6倍,所以这种问题可以通过提高分辨率来解决。

  • DXT2/DXT3:在DXT1中的4x4像素块中附加了64位数据(2个8位的Alpha值 + 16个3位的索引值,每个像素索引占3位,表示8中不同透明状态)来表示Alpha透明信息

    区别:DXT2完成了颜色和Alpha的混合,也就是当Alpha发生改变时,直接改变整体颜色值;DXT3的Alpha信息是相对独立的。

  • DXT4/DXT5:在DXT1中的4x4像素块中附加了64位数据来表示Alpha透明信息,这些透明信息是通过线性插值得来的。

    区别:DXT4完成了颜色和Alpha的混合,也就是当Alpha发生改变时,直接改变整体颜色值;DXT5的Alpha信息是相对独立的。

  • ETC:是一种有损压缩算法,也是把4x4的像素块压缩成64或128位的数据块。

  • ETC1:不支持透明,对于透明纹理,在Android设备上,可以把RGB和A拆到2张ETC1纹理上,游戏中再合并使用。

  • ETC2:向后兼容ETC1,压缩质量更好而且支持透明通道。

  • ASTC:适用于IOS(A8)的苹果手机及使用PowerVR 6XT、Mali T600、Adreno 400series、Tegra K1 GPU的Android手机。

  • PVRTC:压缩比高,也是有损压缩,要求纹理的高和宽必须都是2的整数次幂,最小为8,适用于所有IOS设备和使用PowerVR GPU的Android设备上。

  • PVRTC -2bpp(bit per pixel):每个像素2位,质量较差

  • PVRTC -4bpp(bit per pixel):每个像素4位

图片在Unity如何被使用

当有一张图片进入到Assets时,Unity需要导入该图片

  1. 根据该图片的用途决定将其转换成什么东西?(Texture Type)
  2. 根据当前系统平台采用合适的(GPU)压缩算法

转换后的东西,会存在Library目录下,以meta文件中的guid开头,在apk包中找到这个东西

后续

  1. 渲染管线
  2. 颜色空间
    • 线性
    • Gamma
  3. HDR
  4. 在profiler中确定压缩前后的内存占用,RGBA32 - RGBA crunched ETC2 - RGBA crunched DXT5